"""
@-*- coding: utf-8 -*-
@ python：python 3.8
@ 创建人员:ylx-lingxiao
@ 创建时间:2024/11/12  23:30
@ File:study9.py
@ Explanation: Linux学习
"""
"""
Linux是开源的
Windows不是
所以很多人会拿Linux的开源版本进行二次开发，如 Ubuntu-有桌面应用为主的Linux系统     redhat   

面试问 你们公司的服务器，用的是什么版本的Linux系统  回答  centos--上课用的7.6版本

企业部署选择Linux的原因
1.Linux系统所执行各种程序的速度比win快很多
2.Windows中我们安装各种杀毒软件来保护计算机，Linux中全世界的程序员都在维护
3.Windows中安装各种软件使用时要重启系统或者计算机才能生效，但是在Linux中不用，每安装一种软件都会有相应的服务，只需要使用命令重启软件服务即可
4.Windows系统比较浪费资源，Linux系统启动后 内存 和CPU消耗的资源非常少 
5.Windows中编程要安装不同的开发软件，但是Linux中编程，只需要学会 vi就可以，既我们在Linux中只需要一种类似我们Windows中的记事本就可以完成所有
不需要ppt  不需要EXCEL



访问 Linux  工具   xshell
上传或者下载Linux文件，使用 xftp

xshell  新建  名称给自己看的，用于区分，可以随便填写     主机填写IP地址   协议默认ssh  端口号 22
填写完毕后，点击身份验证
输入用户名 密码    password 
点击确定 点击连接


连接完关闭后 下次再连接 点击新建旁边的文件夹 找到你刚刚创建的即可  双击可以连接 
可以断开  可以重连



xftp 新建  名称随便起，用于区分   主机名输入IP地址    协议默认sftp   端口默认 22   下方输入用户名 密码 password  输入完毕后 点击连接





命令


ls   列出目录下的文件 文件夹名字    
ls -a  全部文件 连同隐藏文件 开头为.的文件一起列出来     每个目录下默认有.  ..    2个点的是返回上级目录   . 是当前目录


ls -l     长数据串列出  包含文件的属性与权限等     等同于  ll     列出当前路径下所有文件 和 文件夹的详细信息
前方是权限
第一位d  文件夹  是- 代表是文件
蓝颜色文件夹   白色是文件
绿色是可执行文件，有执行权限的文件夹
粉色图片
红色 压缩包







ls -R 递归列出所有的文件和目录        一层层的映射每个目录，挨个去找到最后一个节点

先展示当前目录，然后开始找子目录

比如说./123：
123  意思是当前目录下的123文件夹下还有个123文件

mkdir  文件夹名   创建新目录
mkdir  m1 m2 m3  可以一次性创建多个文件夹 这三个文件夹是并列的

mkdir -p   文件夹名 比如说  test1/test2/test3 直接将所有目录，包含上一级目录，递归创建起来 test1 里有test2   test2里有test3
mkdir -p test1/test2/test3

rmdir 文件夹名 删除空目录
rmdir -p 连同上一级空的目录也删除，比如说 rmdir -p test1/test2/test3

touch 文件名  创建文件  没有后缀之分
touch 1 2 3 可以同级下一次性创建3个文件


cd 切换目录
绝对路径   根目录起手  /root/test
相对路径    看你当前在谁下，比如说你已经在/root下，  那你就直接cd  test 

直接cd  进入用户主目录   回到你最初的地方，如果你是root 进来的 那你就直接回到/root


cd ~ 进入用户主目录
cd ..返回上一级目录
cd ../.. 返回上2级目录

cd / 进入根目录

组合命令 cd ../m4  当前路径下返回上一级，然后再进入m4


这个用户主目录跟你使用的账户有关，使用root权限的，那你就可能直接在/root下   使用其它权限的用户  可能就直接先进入用户主目录
root用户比较特殊 它的主目录就是在/root   这个目录下
其它非root  登录后 都在/home/你的用户名  这个目录下



pwd  查看当前所在的绝对路径


上下键  搜索历史命令  回车可以执行



vi文本编辑器
vi today

如果叫today 的文件 存在 那么打开进入
如果不存在，那么新建---但是退出时，记得要保存，否则这个文件不会存在


模式 insert  编辑模式  点击insert按钮  或者  i a o   标志如左下角出现  insert  就可以进行编辑了


esc  命令模式  点击键盘左上角的esc insert消失       q 退出程序  w保存文件  ！强制


wq 退出保存
wq! 强制退出保存
q! 强制退出
G 跳到文件最后一行    命令模式下 大写打开G
gg 跳到文件第一行  命令模式下大写 打开后 按2下g
Ctrl b  向上翻页
ctrl f 向下翻页

比如说文件很多，你要修改某行的数据，那你可以先搜索
进入后 打一个 ?你的内容  然后回车    找到第一个匹配的 然后点击n  切到下一个匹配的    从下往上找的，起始的地方就是你光标出现的地方

dd 2下 可以删除所在的行
删除错了，后悔了  按u   可以撤销




比如说你要vi一个文件  那你先 vi进入
然后insert模式 输入内容
esc   输入冒号 然后开始选择 是直接退出 还是保存退出等  然后回车即可

 
 
vim 是 vi的升级版
vim进入文件后，展示的不一样，自动识别文件类型，加上一些颜色的标识，方便你看，但是其它相关的命令都是一样的



cat  文件名 可以查看文件的内容，但是不用进入到文件中去
cat -n   展示内容所在的行号   就是内容前面，每行 多了个行号



cp 复制文件 或目录
cp  源文件   目标文件夹路径下（推荐使用绝对路径）    前面你要复制的文件，后面你要把这个文件复制到哪里去
如果源是文件 那可以如上，如果是文件夹 后面就要加-r  用来递归持续复制


cp -r   递归持续复制，用于整个文件夹的复制行为

cp -r 源文件夹  目标文件夹

复制多个，前面的都是你的源，最后一个才是你的目标路径
比如说你复制4个 成功3个，修改后再次执行，那其实就会面临是否覆盖的问题，虽然上次整个流程没有成功，但是前面成功的其实已经复制进去了

如果后面你的路径上的文件夹不存在，会怎么办
会把这个文件重新复制一份，然后给他使用后面的名字
文件 或者文件夹 都是这样-------也就是当前目录下复制了，然后重命名了


cp -r m4  mmmmm    mmmmm文件夹就是m4文件夹




rm  删除文件或者目录
格式 rm 文件名   会像你确认是否要删除  y 确认  n 取消

-r  删除文件夹   会逐层进入，问你这个文件夹里边的是否删除，要先删除最子节点的，从内像外的删除，逐层

-f 强制删除文件    不会询问 直接删除
-rf 强制删除文件或文件夹

这里推荐使用相对路径，删除一定要使用相对路径，因为绝对路径/起手，容易删库

rm -rf m4/m5  这个意思是删除了m4里边的m5  m4还是在的




mv 移动或重命名文件夹  文件


mv 源文件夹/文件    目标文件夹/文件   （重命名）  如果后面的文件夹或者 文件不存在时  就重命名    cp命令是复制了一份

mv 源文件   目标文件夹   把某个文件 移动到某个文件夹下
mv 源文件夹  目标路径    把某个文件夹移动到文件夹中


不能用文件夹去覆盖文件



vi 出不去了，此时你要么:q! 强制退出
有人会断开连接或者不小心断开连接了，然后你重新进入，继续vi这个文件  会出问题
因为之前的操作，产生了临时文件，那你无法编辑了，让你做选择怎么样，你直接:q!  然后
ls -a
删除这个隐藏文件即可

此时再vi  这个文件 就可以重新正常编辑了



若本身有2文件
1    a
2    b
现在要在目录下  执行 move 1 2
结果就是 2   内容变成了1    输入命令后 问你是否覆盖，选择y  那就会执行覆盖的操作




find  在指定文件夹下查找文件，并打印绝对路径  如果你忘记某个文件或者文件夹的位置，你就可以在某个路径下查找

比如你知道名字的全称    find / -name 'test.txt'
只知道开头 find / -name 'test*'
只知道结尾   find / -name '*test'
只知道开头和结尾    find / -name 't*t'
不加路径 就默认在当前的目录下去找




tar 命令  用来压缩或者解压文件

tar -cvf   压缩后的包名(可以压缩文件或者文件夹，建议以.tar结尾)  你想将哪些文件夹或文件夹压缩进来 空格隔开   压缩 
因为在Linux系统中  你使用这些结尾，系统默认它是压缩文件 会红色展示，方便你知道
要是不加，那它也是压缩文件，但是由于没有特定的后缀，所以可能会以普通文件来展示
tar -cvf manba.tar 1 m888 h5   回车后  展示详细信息
ll 一下 出现红色的 manba.tar 文件



tar -xvf  后面跟压缩包名称    解压     重复解压 会直接覆盖之前的

v 展示详细信息  你压缩了哪些文件 你解压了哪些文件
f  指一种方式





tail 主要是用来 查看文件后面几行 默认是10行   这避免你查看文件时，如果你直接cat 那这个文件如果10000行，那直接刷屏，会卡住   cat 看的就针对这个文件不大
就几十行的这种

tail  文件  查看文件后10行 
tail -n  数字  文件            也可以直接   tail -数字  文件名  效果和前面的一样

tail -f   文件   持续侦测后面形成的文件  ctrl+c 停止-----------平时看日志的常用命令



如果问测试为什么要会Linux---回答

通过Linux来查看项目的实时日志，发现bug后,辅助开发快速的定位问题解决问题，也方便我们能更早的介入回归测试


echo '字符串' 表示输出里边的内容
echo '字符串' >> 路径   表示将输出的内容追加到此文件的最后一行
对于>> 这个 只要你前面的命令有输出，它就可以追加写到后面的文件中去



系统管理命令
hostname  显示主机名称，服务器的主机名
hostname 新名称     执行后  断开重连  就会生效

clear 清屏
top  动态的显示当前系统中耗费资源最多的进程   会显示cpu   memory   这会是一个动态的页面 实时侦测，Ctrl c  停止
进入后  英文模式下 大写 M   按照内存 从大到小排序   你怎么知道这是什么程序呢，关键就是pid  这个就是程序的进程号
进入后  英文模式下 大写 P  按照CPU  从大到小排序 
最上面是总的占用  上方的内存单位是b   total  总的  free 可以使用的   used 已经使用的


ps 用来显示当前进程的状态，或者查看具体的进程信息，查看某个程度的进程号
ps -e   显示所有进程
ps -f    显示程序之间的关系
ps -ef   常用的是这个的组合
ps -ef |grep python    查找Python进程
使用管道符过滤，那么总会有一个这样的进程出现---帮你过滤的进程，grep本身，所以，如果有你要找的目标，那么数量一定是大于等于2的，因为帮你过滤的这个进程也算其中的一个

管道过滤还可以这样用--后面跟关键字符

cat -n 1 |grep 你     过滤这个文件中 包含你的行
ll |grep txt    这些都是管道符过滤的使用例子



uid 用户ID
pid 进程ID
ppid 父进程
c cpu 占有率
time 耗时



kill 杀掉进程  
kill 8963 杀掉pid号为8963的进程
kill -9 6332 强制杀掉pid号为6332 的进程


xshell中你要多开当前窗口，你可以右键选择复制会话即可



shutdown  关机   一般别用
logout 注销---潇洒的退出
reboot 重启---一般不要尝试，避免某些环境的服务没有开机自启动

ping   确定网络和外部主机的状态-----进入企业 给了你一个服务器地址  你连接不上，你问别人又显得你比较low,此时你先
此时你可以先ping这个地址 看是否通，如果这个IP能给你响应，那么证明
你们之间是通的  一般Linux中 我们是用此命令来ping另外一台服务器--一般也不会用，因为都是局域网，肯定能通
，Windows中 我们使用这个 是来pingLinux服务器的，看我们是否能通，通就能连

如果你无法ping通，一般来说，可能由于某些原因，比如防火墙，认证这类的原因，那么第一个解决方案可以是--联系运维，都要连接公司的内网，vpn 然后才能访问--运维会给你开一个账号，然后你来连接即可
如果能ping通你还连接不上，可能就是你的账户密码错误了 检查一下


date 显示或者设置当前系统的时间  不加参数，默认显示当前系统的时间
date -s 2019-9-19   修改日期
date -s 15:30:11   修改时间
date -s '2019-9-19 15:30:11'  修改日期和时间

一般来说，不要主动改服务器时间，你改完了可能还要找运维去调或者配置，所以一般就不要改这个时间，比如说你要测年会员的，那你这样改动后，可能上面的月会员，季度会员都要过期
这些时间的改动，会引起不可逆的结果，比如说恢复你的会员，开发代码也不会做这样的容错处理，因为一般来说，生产环境的服务器时间不会改

你想构造什么样的数据，你可以去改库


free  查看内存的使用情况
-m   MB
-k  KB
-g  GB
-h  自适应单位



cst  chinese standard time  中国标准时间

在Linux中 每个用户都必须有一个用户组，不允许用户没有组的情况出现
所以必须要先有组


cat /etc/group   查看用户组
显示的分别为  组名-x-组ID

cat /etc/passwd  查看用户
用户名-x-用户ID-组ID-注释，可有可无-用户主目录，如/home/用户名称-运行shell脚本的一个命令，也就是你通过这个用户登录后，执行相关的shell脚本 都用的是这个命令 /bin/bash

上述的x都没有实际的意义

groupadd  增加组

groupmod 修改组
groupmod -n test121 test1212   将用户组test1212 修改为 test121        前新 后旧
groupdel 删除用户组

useradd 增加用户                不指定组，那就默认给你建一个组。这个组的组名就是你的用户名
useradd  username -c miaoshu -g test1212                  -c  指定一段注释性描述     -g 指定用户所属的用户组
描述要加引号

usermod 修改用户
usermod -l username1 username     前新后旧  将原来的username 改为 username1              但是你的用户主目录名不变，就是你第一次名称建立的那个
usermod -c miaoshu1 username1   将username1 的用户描述修改为 miaoshu1
usermod -g test23 username1 将username1 用户移动到 test23中

userdel 删除用户
建议强制删除  userdel -rf username   否则有可能不清除用户主目录，避免删除的不干净



修改用户名的密码
passwd username   回车  
不会有任何提示，记住你输入的
连续2次输入一致 回车
告诉你成功了---这个用户的密码就设置好了



前面这里 只有root用户是井号 其它用户都是dollar符号




权限相关的命令，我们上面给大家举例讲解了如何创建账号密码，那一般来说，公司的测试环境你可以有root权限，但是生产环境，要区分权限，也就是说会严格控制哪个账号或者角色对应有什么样的权限

su 切换用户

su - 用户名
root用户像任何用户切换不用输入密码，其它用户的彼此切换或者切换至root用户需要输入密码
切换成功后 可以logout  退出 然后回到你切换之前的用户



chown 更改文件的拥有者
参数 R 更改文件夹的拥有者
chown 用户：用户组  文件

ll 文件前面有对应的解释，除了第一个，其它的显示的是对应的权限，人-人所在的组-其它

对于新建文件夹  和新建文件来说  一般 文件夹每个的权限都会比文件 在末尾多一个x   因为这是取决于能否CD 进入文件夹内部的
mkdir  m1
touch t1
ll
drwx-r-xr-x
-rw-r--r--

比如说拥有者的权限，同组内其它人没有，
解决方案1   把拥有者改为你
这种操作仅允许root用户来完成，不允许普通用户之间之间操作

这里的组不要求和前面用户有关系的组，但是当你新建文件时，它默认选的你所在的组
chown 目标用户：组 文件名称     你可以给你的目标人 可以给任何组，它们之间无相互关系，执行完后 你在看 对应的拥有者和组就变更过来了，组必须是在这
之前存在的组

如果你的目标是文件夹，那么你如果按照上面这种操作，那么你只能操作修改这个文件夹的，不能递归修改文件夹内部的，如果你想递归修改
那你应该加参数-R  就可以完成



第二种方式，直接去修改前面的权限，所以在你使用这个命令的时候 你一定要知道你和这个文件拥有者的关系 ，是否是组内的人 还是组外的人
chmod
r 4   读权限  对于文件      对于文件夹 是可以进入
w 2   写入权限
x 1    执对文件来说 执行权限  对文件夹来说 切换权限
- 不具有任何权限，数字代号为0

-R 对目录下的所有文件与子目录进行相同的权限变更，递归的方式逐个变更


chmod 777 文件名/文件夹名称

这个命令 root用户或者文件本身的拥有者都可以操作这个命令



如果你拥有别人文件 只读的权限 你vi进入后，编辑完 无法直接wq保存 必须 wq!强制保存，保存完毕后，，这个文件的拥有者就变为了你
具体底层的实现可能是复制了一份内容，删除原有内容，修改当前文件名称

所以 如果你想编辑 那你就找拥有者 给你增加一些相应的权限 还是比较方便的 就没上面这些事了



最后一个是执行权限，一般来说，代表它是一些脚本，一般是运维写的一些项目 部署的启动脚本，也就是shell脚本，基于Linux原生的语言写的脚本


./   这个代表 当前目录     也可以用于执行当前目录下的可执行文件

加了执行权限后 文件会变为绿色


绝对路径也可以，只要你指向这个文件 就可以执行  比如 /home/mab/m1/m2
相对路径也可以，比如你已经cd  home/mab
m1/m2 也可以运行这个脚本



查看磁盘和内存的命令
df -h 显示指定磁盘文件的可用空间
-h 是自动选择后面的单位，可读性比较好，重点还是看使用率，避免使用率超过80
filesystem 磁盘
size 磁盘总大小
used 已使用
avail 可用
use%  使用率
mounted on  挂载到哪个目录下 / 代表根目录


使用命令后，列表中
tmpfs或者含有这个的 都是一些临时的文件 不需要关注



du -h 显示每个文件和目录的磁盘使用空间

du -sh 看当前目录下整体大小，你进入对应的文件夹后，可以使用 查看这个文件夹或者目录下，到底有多大
不加s 会显示系统的  加了就会显示的可读性高


du -sh ./*  看你当前文件夹下  1级目录下 每个文件夹的大小



free 显示系统使用和空闲的内存情况

free -k   KB   默认单位
-m   MB
-g   GB
-h 自动匹配合适单位
total 总物理内存
used使用
free 可以用多少
shared 多个进程共享的内存总额
buffers  cached 磁盘缓存大小
available 可回收利用大小
swap 指一个交换分区或文件


一般我们看这个的时候就是要看 比如说项目启动时 报错  out of memory  
内存溢出  想要的超出了 我能给你的
内存泄露  内存没有合理的回收机制 被一些无用的程序占用了，导致可用的内存越来越少，比如说一个项目使用完 一直不关闭 一直占用着内存
这也是你后面做性能测试的一个指标之一  稳定性  看项目持续运行很长时间后 是否会出现内存泄露的问题    内存泄露最终导致的内存溢出





学命令的一个主要目的就是为了去搭建对应的测试环境
怎么搭建--公司的开发或者运维会给你一个搭建文档


悟空项目搭建
用来部署的工具 tomcat
开发写的项目，打成一个root.war包  --开发语言是Java语言


将tomcat包传至对应的文件夹下
unzip  ---.zip    解压这个zip包
进入这个解压后的文件夹中
进入bin目录下  .sh结尾的给Linux中用，.bat结尾的给Windows用
./ start.sh
无权限的话 需要修改权限
chmod -R 744 bin  给bin目录下的所有文件加写的权限

然后查看默认端口是否被占用
使用netstat -ntpl 查看所有正在被使用的端口   如果被占用则kill进程释放端口   kill pid
 你可以看到22这个端口正在被使用 这就是我们使用shell 连接时 ssh 协议   目标服务器暴露22端口给我们  使用sshd服务 才能让我们保持访问的
 所以不要kill你不认识的端口，你如果kill   22这个占用端口的pid  那所有通过xshell连接的人会立马断开 因为服务停了
 
 
 tomcat 的配置文件 在 conf 文件中 server.xml这个文件
 
 
 
 然后 你确认端口没有人占用时，你可以直接进入bin目录
 ./ startup.sh  启动tomcat
 
 通过tail -f  查看启动日志 是否成功
 tail -f logs/catalina.out   这个里边时比较核心的日志   tail -f  默认展示倒数10行的日志
 看到比如说启动成功类似的日志就证明你部署成功了 
 
 此时还可以再次验证，你可以去访问这个项目
 
 http://你服务器的IP地址：8080
 
看到tomcat的页面  证明你的tomcat服务已经部署成功了，这个页面由tomcat自身提供 在webapps内的root目录中资源的加载--但是我们不希望给用户展示这个

刷新一下，通过xftp进入对应的目录
删除webapps目录喜爱的root文件夹  通过xftp将war包上传至webapps下

然后将开发的war包上传至webapps目录下---你只管上传就行 ，tomcat会自动识别并给你部署
生成一个root文件夹

然后此时你继续去访问这个IP+端口 项目成功部署，可以访问，对应的日志被记录




第二次部署---比如说为了验证bug
你要重新部署
你可以先把之前老的war包移到其它文件夹下，比如说你专门建立一个文件夹存放之前的war包
然后你删除这个root文件夹，然后上传新的war包 部署完成即可
这样就是避免新的war包有问题，老包又被你删除了，从而阻塞测试












搭建前后端代码分离的项目--上面这个项目前后端的代码是在一起的，缺点就是一个人改了，所有人得陪着，有可能别人改的地方也会影响到你，前后端
分离项目的好处就是 前端有问题的 更新前端代码包，后端有问题的更新后端的

借助apache httpserver 这个服务（器）  或者说我们就是依赖apache web服务器软件  这是一个开放源码的网页服务器
那我们依赖这个服务 在Linux中这个服务的名称就叫httpd  占用80端口

在你的服务器上找一个目录，把这个目录公开到浏览器上，也就是说你可以i通过IP 端口 加对应的目录的路径就可以访问服务器上对应的路径或者目录下的文件
也就是说提供了 通过浏览器 就能访问服务器上的文件或者文件夹--这就是Apache httpserver 最主要的功能

/var/www/html  这个目录下的内容你是可以直接访问的--只能看到这个目录下的内容，通过Apache httpserver

你可以通过 IP+端口+/项目路径 来直接在浏览器中实现对 服务器的访问


我们借助这个功能 可以先将前端代码放到这个目录中来

先清空 /var/www/html  这个目录下的全部内容
将前端的tar包  上传至这个目录  
tar -xvf  解压

完成后 浏览器访问 
http://ip：端口/路径 

完成前端部署




后端部署
先检查端口  比如确保8088端口不被占用  netstat -ntpl
如果占用 kill  pid


然后上传  jar包
可以上传至任意目录下，无要求

然后在对应的目录下启动jar包--先临时启动
java -jar  jar包名称

和前端正常交互后 


Ctrl+c
然后切换为后台启动
nohup  java -jar  jar包名称 &
回车执行即可
tail -f 查看 nohup.out的实时日志

ps -ef |grep wuye  查看瞬时进程



第三种
纯jar包的前后端代码在一起的，直接 启动jar包就可以了  ，上传jar包到任意目录
nohup  java -jar  jar包名称 &
 """


# a,b = 1,2
# print(b)